package org.grow.infru.controller;

import org.grow.infru.dao.HolyBillRepository;
import org.grow.infru.entity.HolyBill;
import org.grow.infru.entity.TestBill;
import org.grow.infru.service.CodeGene;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Optional;

/**
 * @Author: xwg
 * @CreateDate: 2022/2/18
 */

@RequestMapping("/holyBill")
@RestController
public class HolyBillController {
    @Autowired
    private ThreadLocal<CodeGene> codeGeneThreadLocal;
    @Autowired
    private HolyBillRepository holyBillRepository;

    @PostMapping("/insert")
    public HolyBill insert(@RequestBody HolyBill holyBill) {
        holyBill.setHolyBillId(codeGeneThreadLocal.get().nextCode("TESTS"));
//        初次进行业务初始化 来自前端不信任的数据
        holyBill.setApplier(SecurityContextHolder.getContext().getAuthentication().getName());
        holyBill.setWorkTime(LocalDateTime.now());
        holyBill.getHolyDetails().forEach(x->{
            x.getHolyDetailId().setHbCodeFk(holyBill.getHolyBillId());
            x.setHolyBill(holyBill);
        });
        HolyBill save = holyBillRepository.save(holyBill);
        return save;
    }
    @GetMapping("/find/{code}")
    public Optional<HolyBill> findByPk(@PathVariable("code") String code) {
        Optional<HolyBill> byId = holyBillRepository.findById(code);
//        System.out.println("=======test===eager");
//        fetch type lazy时候 查询语句不是连表 而responsebody注解序列化时候会补充
        return byId;
    }

    @PostMapping("/modify")
    public HolyBill modify(@RequestBody HolyBill holyBill) {
//        修改一个领域实体 = one的修改和many的增删改
//        需要提前做出哪些校验呢？ testBillId是否存在
//        级联修改 如果是新增的子项但是id是已有的id 就会覆盖已有的外键，导致外键update
//        导致发生 主表之间抢夺子项的不合法  应该报错比较合适 或者 修改只能修改单项 不允许级联


        /*前端序列化导致关系不健全 必须健全所有关系 不能省略如FKid*/
        /*sql轻松 的代价 是 一 学习注解构建模型  二 健全关系*/
        /*xuliehua biran nangao */
        holyBill.getHolyDetails().forEach(x->{
            x.getHolyDetailId().setHbCodeFk(holyBill.getHolyBillId());
            x.setHolyBill(holyBill);
        });
        HolyBill save = holyBillRepository.save(holyBill);
        return save;

    }
}
